import java.util.Random;
import java.util.Vector;



public class Colonia
{
	private Grid grid;
	private Vector<Aminoacido> proteina;
	private char[] strProteina;
	private char[] solucao;
	private char[] movimentos;
	private int posInicialX;
	private int posInicialY;
	private int posAtualX;
	private int posAtualY;
	private char orientacao, NORTE=0, SUL=1, LESTE=2, OESTE=3;
	private int energiaSolucao;
	private int energia;
	private int numAminoacidos;
	private double probabilidadeD, probabilidadeE, probabilidadeF;
	
	
	public Colonia(char[] strProteina, double taxaFeromonioInicial) 
	{
		this.strProteina = strProteina;
		int size = strProteina.length;
		proteina = new Vector<Aminoacido>(size);
		for(int i=0; i<size; i++){
			Aminoacido a = new Aminoacido(i, taxaFeromonioInicial, taxaFeromonioInicial, taxaFeromonioInicial);
			proteina.add(a);
		}
		grid = new Grid(size);
		posInicialX = size;
		posInicialY = size;
		solucao = new char[size-2];
		energiaSolucao = 0;
	}

	public void solve(int max_iter, int nFormigas, double taxaEvaporacaoFeromonio)
	{
		Random rn = new Random();
		double aleatorio;
		int tamProteina = proteina.capacity();
		int t;
		double divisaProbabilidade1, divisaProbabilidade2;
		boolean solucaoInvalida;
		
		
		t = 0;
		while (t < max_iter){
			
			for (int i=0; i<nFormigas; i++){ //para cada formiga
				
				initIteration();
				solucaoInvalida = false;

				while(numAminoacidos < tamProteina){
					
					calculaProbabilidades(numAminoacidos, strProteina[numAminoacidos]);
					
					divisaProbabilidade1 = probabilidadeD;
					divisaProbabilidade2 = probabilidadeD+probabilidadeE;
					
					if(Double.compare(probabilidadeD, 0.0) == 0 && Double.compare(probabilidadeE, 0.0) == 0 && Double.compare(probabilidadeF, 0.0) == 0)
					{
						solucaoInvalida = true;
					}
					
					aleatorio = rn.nextDouble();
					while(!solucaoInvalida && (aleatorio == 0 || (!(Double.compare(probabilidadeD, 0.0) > 0 && aleatorio<=divisaProbabilidade1) && !(Double.compare(probabilidadeE, 0.0) > 0 && aleatorio>divisaProbabilidade1 && aleatorio<=divisaProbabilidade2) && !(Double.compare(probabilidadeF, 0.0) > 0 && aleatorio>divisaProbabilidade2))))
					{
						System.out.println(i+ " probD "+probabilidadeD+" probE "+probabilidadeE+" probF "+probabilidadeF);
						System.out.println("divisaProb1: " + divisaProbabilidade1 + " divisaProb2: " + divisaProbabilidade2 + " aleatorio: " + aleatorio);
						aleatorio = rn.nextDouble();
					}
							
					if(!solucaoInvalida){
						
						//atualiza dados conforme disposição no grid...
						if(probabilidadeD>0 && aleatorio<=divisaProbabilidade1){ //se D
							
							if(orientacao==NORTE && !grid.isPositionOccupied(posAtualX+1, posAtualY)){
								grid.setGridPos(posAtualX+1, posAtualY, proteina.get(numAminoacidos));
								posAtualX++;
								orientacao = LESTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
								}
								movimentos[numAminoacidos-2] = 'D';
								numAminoacidos++;
							}
							else if(orientacao==SUL && !grid.isPositionOccupied(posAtualX-1, posAtualY)){
								grid.setGridPos(posAtualX-1, posAtualY, proteina.get(numAminoacidos));
								posAtualX--;
								orientacao = OESTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
								}
								movimentos[numAminoacidos-2] = 'D';
								numAminoacidos++;
							}
							else if(orientacao==LESTE && !grid.isPositionOccupied(posAtualX, posAtualY+1)){
								grid.setGridPos(posAtualX, posAtualY+1, proteina.get(numAminoacidos));
								posAtualY++;
								orientacao = SUL;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
								}	
								movimentos[numAminoacidos-2] = 'D';
								numAminoacidos++;
								
							}
							else if(orientacao==OESTE && !grid.isPositionOccupied(posAtualX, posAtualY-1)){
								grid.setGridPos(posAtualX, posAtualY-1, proteina.get(numAminoacidos));
								posAtualY--;
								orientacao = NORTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
								}	
								movimentos[numAminoacidos-2] = 'D';
								numAminoacidos++;
							}
							
							
						}
						else if(probabilidadeE>0 && aleatorio>divisaProbabilidade1 && aleatorio<=divisaProbabilidade2){ //se E
							
							if(orientacao==NORTE && !grid.isPositionOccupied(posAtualX-1, posAtualY)){
								grid.setGridPos(posAtualX-1, posAtualY, proteina.get(numAminoacidos));
								posAtualX--;
								orientacao = OESTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
								}
								movimentos[numAminoacidos-2] = 'E';
								numAminoacidos++;	
							}
							else if(orientacao==SUL && !grid.isPositionOccupied(posAtualX+1, posAtualY)){
								grid.setGridPos(posAtualX+1, posAtualY, proteina.get(numAminoacidos));
								posAtualX++;
								orientacao = LESTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
								}
								movimentos[numAminoacidos-2] = 'E';
								numAminoacidos++;	
								
							}
							else if(orientacao==LESTE && !grid.isPositionOccupied(posAtualX, posAtualY-1)){
								grid.setGridPos(posAtualX, posAtualY-1, proteina.get(numAminoacidos));
								posAtualY--;
								orientacao = NORTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
								}	
								movimentos[numAminoacidos-2] = 'E';
								numAminoacidos++;	
								
							}
							else if(orientacao==OESTE && !grid.isPositionOccupied(posAtualX, posAtualY+1)){
								grid.setGridPos(posAtualX, posAtualY+1, proteina.get(numAminoacidos));
								posAtualY++;
								orientacao = SUL;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
								}		
								movimentos[numAminoacidos-2] = 'E';
								numAminoacidos++;	
							}
						
							
						}
						else if(probabilidadeF>0 && aleatorio>divisaProbabilidade2){ //se F
							
							if(orientacao==NORTE && !grid.isPositionOccupied(posAtualX, posAtualY-1)){
								grid.setGridPos(posAtualX, posAtualY-1, proteina.get(numAminoacidos));
								posAtualY--;
								orientacao = NORTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
								}
								movimentos[numAminoacidos-2] = 'F';
								numAminoacidos++;
							}
							else if(orientacao==SUL && !grid.isPositionOccupied(posAtualX, posAtualY+1)){
								grid.setGridPos(posAtualX, posAtualY+1, proteina.get(numAminoacidos));
								posAtualY++;
								orientacao = SUL;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
								}
								movimentos[numAminoacidos-2] = 'F';
								numAminoacidos++;
								
							}
							else if(orientacao==LESTE && !grid.isPositionOccupied(posAtualX+1, posAtualY)){
								grid.setGridPos(posAtualX+1, posAtualY, proteina.get(numAminoacidos));
								posAtualX++;
								orientacao = LESTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
								}	
								movimentos[numAminoacidos-2] = 'F';
								numAminoacidos++;
								
							}
							else if(orientacao==OESTE && !grid.isPositionOccupied(posAtualX-1, posAtualY)){
								grid.setGridPos(posAtualX-1, posAtualY, proteina.get(numAminoacidos));
								posAtualX--;
								orientacao = OESTE;
								if(strProteina[numAminoacidos]=='h'){
									if(grid.getGridPos(posAtualX, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY).getId()]=='h')
										energia++;
									if(grid.getGridPos(posAtualX, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1).getId()]=='h')
										energia++;
								}		
								movimentos[numAminoacidos-2] = 'F';
								numAminoacidos++;
							}
								
							
						}
					
						//se uma solução melhor é encontrada...
						if(energia > energiaSolucao){
							energiaSolucao = energia;
							solucao = movimentos;
						}
						
						//atualiza feromônio...
						updateFeromonio(taxaEvaporacaoFeromonio, energia);
						
					}
					else{ //se solução impossível, tenta novamente para a mesma formiga...
						i--;
						continue;
					}
				}
			}
			t++;
		}		
	}
	
	//Zera grid e insere os primeiros 2 aminoácidos, que não importam a direção.
	//Foram inseridos a partir do ponto central do grid, para a direita (orientação LESTE)
	public void initIteration()
	{
		grid.refreshGrid();
		posAtualX = posInicialX;
		posAtualY = posInicialY;
		grid.setGridPos(posAtualX, posAtualY, proteina.get(0));
		grid.setGridPos(posAtualX+1, posAtualY, proteina.get(1));
		posAtualX++;
		orientacao = LESTE;
		numAminoacidos = 2;
		energia = 0;
		movimentos = new char[strProteina.length-2];
	}
	
	//Atualiza feromônio (tij(t) = (1−r)tij(t) + Dt)
	public void updateFeromonio(double taxaEvaporacao, int energ)
	{
		double energia = ((double)energ) / 10.0;
		for(int i=0; i<strProteina.length; i++){
			proteina.get(i).setFeromonioD(proteina.get(i).getFeromonioD()*(1.0-taxaEvaporacao));
			proteina.get(i).setFeromonioE(proteina.get(i).getFeromonioE()*(1.0-taxaEvaporacao));
			proteina.get(i).setFeromonioF(proteina.get(i).getFeromonioF()*(1.0-taxaEvaporacao));
		}
		for(int i=0; i<movimentos.length; i++){
			if(movimentos[i]=='D')
				proteina.get(i+2).setFeromonioD(proteina.get(i+2).getFeromonioD()+energia);
			else if(movimentos[i]=='E')
				proteina.get(i+2).setFeromonioE(proteina.get(i+2).getFeromonioE()+energia);
			else if(movimentos[i]=='F')
				proteina.get(i+2).setFeromonioF(proteina.get(i+2).getFeromonioF()+energia);
		}	
	}
	
	//Calcula as probabilidades E, D, F
	public void calculaProbabilidades(int idUltimo, char letra)
	{
		
		double desireD=1.0, desireE=1.0, desireF=1.0;
		int alfa=1, beta=2; //parâmetros de peso!
		
		probabilidadeD = 0.0;
		probabilidadeE = 0.0;
		probabilidadeF = 0.0;
		
		//calcula as desirebilities...
		if(orientacao==NORTE){
			
			if(grid.getGridPos(posAtualX+1, posAtualY)==null){//D
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX+1+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1+1, posAtualY).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX+1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY-1).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX+1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY+1).getId()]=='h')
						desireD++;
				}
				
			}
			else
				probabilidadeD = -1;
			if(grid.getGridPos(posAtualX-1, posAtualY)==null){//E
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX-1-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1-1, posAtualY).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX-1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY-1).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX-1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY+1).getId()]=='h')
						desireE++;
				}
			}
			else
				probabilidadeE = -1;
			if(grid.getGridPos(posAtualX, posAtualY-1)==null){//F
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX, posAtualY-1-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1-1).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX+1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY-1).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX-1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY-1).getId()]=='h')
						desireF++;
				}
			}
			else
				probabilidadeF = -1;
			
		}
		else if(orientacao==SUL){
			
			if(grid.getGridPos(posAtualX-1, posAtualY)==null){//D
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX-1-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1-1, posAtualY).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX-1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY-1).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX-1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY+1).getId()]=='h')
						desireD++;
				}
				
			}
			else
				probabilidadeD = -1;
			if(grid.getGridPos(posAtualX+1, posAtualY)==null){//E
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX+1+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1+1, posAtualY).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX+1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY-1).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX+1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY+1).getId()]=='h')
						desireE++;
				}
			}
			else
				probabilidadeE = -1;
			if(grid.getGridPos(posAtualX, posAtualY+1)==null){//F
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX, posAtualY+1+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1+1).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX+1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY+1).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX-1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY+1).getId()]=='h')
						desireF++;
				}
			}
			else
				probabilidadeF = -1;
			
		}
		else if(orientacao==LESTE){
			
			if(grid.getGridPos(posAtualX, posAtualY+1)==null){//D
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX, posAtualY+1+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1+1).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX+1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY+1).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX-1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY+1).getId()]=='h')
						desireD++;
				}
				
			}
			else
				probabilidadeD = -1;
			if(grid.getGridPos(posAtualX, posAtualY-1)==null){//E
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX, posAtualY-1-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1-1).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX+1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY-1).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX-1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY-1).getId()]=='h')
						desireE++;
				}
			}
			else
				probabilidadeE = -1;
			if(grid.getGridPos(posAtualX+1, posAtualY)==null){//F
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX+1+1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX+1+1, posAtualY).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX+1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY-1).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX+1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY+1).getId()]=='h')
						desireF++;
				}
			}
			else
				probabilidadeF = -1;
			
		}
		else if(orientacao==OESTE){
			
			if(grid.getGridPos(posAtualX, posAtualY-1)==null){//D
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX, posAtualY-1-1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY-1-1).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX+1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY-1).getId()]=='h')
						desireD++;
					else if(grid.getGridPos(posAtualX-1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY-1).getId()]=='h')
						desireD++;
				}
			}
			else
				probabilidadeD = -1;
			if(grid.getGridPos(posAtualX, posAtualY+1)==null){//E
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX, posAtualY+1+1)!=null && strProteina[grid.getGridPos(posAtualX, posAtualY+1+1).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX+1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX+1, posAtualY+1).getId()]=='h')
						desireE++;
					else if(grid.getGridPos(posAtualX-1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY+1).getId()]=='h')
						desireE++;
				}
			}
			else
				probabilidadeE = -1;
			if(grid.getGridPos(posAtualX-1, posAtualY)==null){//F
				
				if(letra=='h'){
					if(grid.getGridPos(posAtualX-1-1, posAtualY)!=null && strProteina[grid.getGridPos(posAtualX-1-1, posAtualY).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX-1, posAtualY+1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY+1).getId()]=='h')
						desireF++;
					else if(grid.getGridPos(posAtualX-1, posAtualY-1)!=null && strProteina[grid.getGridPos(posAtualX-1, posAtualY-1).getId()]=='h')
						desireF++;
				}
			}
			else
				probabilidadeF = -1;
			
		}
			
		
		//número de 0 a 1...
		desireD /= 3.0;
		desireE /= 3.0;
		desireF /= 3.0;
		
		double probabilidadeDAux = probabilidadeD;
		double probabilidadeEAux = probabilidadeE;
		double probabilidadeFAux = probabilidadeF;
		
		//calcula fórmula...
		int aux = idUltimo;
		double soma = 0;
		
		//System.out.println(aux);
		
		//calcula probabilidades:
		if(probabilidadeDAux!=-1) soma += (Math.pow(desireD, alfa))*(Math.pow(proteina.get(aux).getFeromonioD(), beta));
		if(probabilidadeEAux!=-1) soma += (Math.pow(desireE, alfa))*(Math.pow(proteina.get(aux).getFeromonioE(), beta));
		if(probabilidadeFAux!=-1) soma += (Math.pow(desireF, alfa))*(Math.pow(proteina.get(aux).getFeromonioF(), beta));
		probabilidadeD = probabilidadeDAux==-1 ? 0.0 : ((Math.pow(desireD, alfa))*(Math.pow(proteina.get(aux).getFeromonioD(), beta)))/soma;
		probabilidadeE = probabilidadeEAux==-1 ? 0.0 : ((Math.pow(desireE, alfa))*(Math.pow(proteina.get(aux).getFeromonioE(), beta)))/soma;
		probabilidadeF = probabilidadeFAux==-1 ? 0.0 : ((Math.pow(desireF, alfa))*(Math.pow(proteina.get(aux).getFeromonioF(), beta)))/soma;
		
	}
	
	//imprime solução
	public void imprimeSolucao()
	{
		for (int i = 0; i < solucao.length; i++)
		{
			System.out.print(solucao[i]);
		}
		System.out.println();
		System.out.println("Energia: -" + energiaSolucao);
	}
	
	public void imprimeGridFinal(){
		int size = 2 * strProteina.length + 2;
		for(int j = 0; j < size; j++)
		{
			for (int i = 0; i < size; i++)
				if(grid.getGridPos(i, j)!= null)
					System.out.print(strProteina[grid.getGridPos(i, j).getId()]);
				else
					System.out.print(" ");
			System.out.println();
		}
	}

	/**
	 * @return the energiaSolucao
	 */
	public int getEnergiaSolucao() {
		return energiaSolucao;
	}

	/**
	 * @param energiaSolucao the energiaSolucao to set
	 */
	public void setEnergiaSolucao(int energiaSolucao) {
		this.energiaSolucao = energiaSolucao;
	}
}
